package com.ym.utils;

import com.ym.manager.sys.model.SysInfo;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.Swap;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;

/**
 * 方法描述:系统信息
 * 备注：此方法借助org.hyperic.sigar工具实现
 * author 小刘
 * version v1.0
 * date 2017/4/17 10:56
 */
public class SystemUtils {

    // 系统基本信息
    public static SysInfo sysBasic(){
        SysInfo sysInfo = new SysInfo();
        Runtime r = Runtime.getRuntime();
        Properties props = System.getProperties();
        InetAddress addr = null;
        String ip = "";
        String hostName = "";
        try {
            addr = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            ip = "无法获取主机IP";
            hostName = "无法获取主机名";
        }
        if (null != addr) {
            try {
                ip = addr.getHostAddress();
            } catch (Exception e) {
                ip = "无法获取主机IP";
            }
            try {
                hostName = addr.getHostName();
            } catch (Exception e) {
                hostName = "无法获取主机名";
            }
        }
        sysInfo.setIp(ip);              // 本地IP
        sysInfo.setHostName(hostName);  // 本地主机名
        sysInfo.setOsName(props.getProperty("os.name")); // 操作系统名称
        sysInfo.setArch(props.getProperty("os.arch")); // 操作系统的构架
        sysInfo.setOsVersion(props.getProperty("os.version"));// 操作系统的版本
        sysInfo.setProcessors(r.availableProcessors());// JVM可以使用的处理器个数
        sysInfo.setJavaVersion(props.getProperty("java.version"));// Java的运行环境版本
        sysInfo.setVendor(props.getProperty("java.vendor"));// Java的运行环境供应商
        sysInfo.setJavaUrl(props.getProperty("java.vendor.url"));// Java供应商的URL
        sysInfo.setJavaHome(props.getProperty("java.home"));// Java的安装路径
        sysInfo.setTmpdir(props.getProperty("java.io.tmpdir"));// 默认的临时文件路径
        return sysInfo;
    }

    // 内存信息
    public static SysInfo memory(Sigar sigar){
        SysInfo sysInfo = new SysInfo();
        try {
            Runtime r = Runtime.getRuntime();
            sysInfo.setJvmTotal(Common.div(r.totalMemory(), (1024 * 1024), 2) + "M");// java总内存
            sysInfo.setJvmUse(Common.div(r.totalMemory() - r.freeMemory(), (1024 * 1024), 2) + "M");// JVM使用内存
            sysInfo.setJvmFree(Common.div(r.freeMemory(), (1024 * 1024), 2) + "M");// JVM剩余内存
            sysInfo.setJvmUsage(Common.div(r.totalMemory() - r.freeMemory(), r.totalMemory(), 2));// JVM使用率

            Mem mem = sigar.getMem();
            // 内存总量
            sysInfo.setRamTotal(Common.div(mem.getTotal(), (1024 * 1024 * 1024), 2) + "G");// 内存总量
            sysInfo.setRamUse(Common.div(mem.getUsed(), (1024 * 1024 * 1024), 2) + "G");// 当前内存使用量
            sysInfo.setRamFree(Common.div(mem.getFree(), (1024 * 1024 * 1024), 2) + "G");// 当前内存剩余量
            sysInfo.setRamUsage(Common.div(mem.getUsed(), mem.getTotal(), 2));// 内存使用率

            Swap swap = sigar.getSwap();
            // 交换区总量
            sysInfo.setSwapTotal(Common.div(swap.getTotal(), (1024 * 1024 * 1024), 2) + "G");
            // 当前交换区使用量
            sysInfo.setSwapUse(Common.div(swap.getUsed(), (1024 * 1024 * 1024), 2) + "G");
            // 当前交换区剩余量
            sysInfo.setSwapFree(Common.div(swap.getFree(), (1024 * 1024 * 1024), 2) + "G");
            sysInfo.setSwapUsage(Common.div(swap.getUsed(), swap.getTotal(), 2));//
        }catch (Exception e){
            e.printStackTrace();
            Logger.error(e);
        }
        return sysInfo;
    }
}
